//
//  SqliteManager.swift
//  FMDBDemo
//
//  Created by whitcast on 16/7/22.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

//  数据库名字
private let dbName = "Weibo.db"

//  数据库路径
private let dbPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent(dbName)

//  数据库操作专用类
class SqliteManager: NSObject {
    //  单例全局访问点
    static let manager: SqliteManager = SqliteManager()
    //  懒加载数据库操作队列
    lazy var queue = FMDatabaseQueue(path: dbPath)
    //  构造函数私有化
    private override init() {
        super.init()
        
        print(dbPath)
        //  创建库及表
      
        createTables()
       
    }
    
    //  创建表
    private func createTables() {
        //  准备sql语句
        
        let sqlPath = NSBundle.mainBundle().pathForResource("db.sql", ofType: nil)!
        
        //  读取文件内容
        //  try! 表示我的内容一定存在表示数据没有问题
        let sql = try! String(contentsOfFile: sqlPath)
        //  try? 表示我们的数据如果有问题直接返回nil, 如果有值直接返回
//        let sql1 = try? String(contentsOfFile: sqlPath)
//        
//        
//        //  判断这个执行的函数是否有异常
//        do {
//            let sql2 = try String(contentsOfFile: sqlPath)
//            
//            print(sql2)
//
//        } catch {
//            print(error)
//        }
        
        //  执行sql语句
        
        queue.inDatabase { (db) -> Void in
            let result = db.executeStatements(sql)
            if result {
                print("创表成功")
            } else {
                print("创表失败")
            }
        }
    }
    
    //  插入数据
    func insert() {
        //  准备sql语句
        let sql = "INSERT INTO T_PERSON(NAME, AGE) VALUES(?, ?)"
        
        //  执行sql
        queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: ["杨钰莹", 18])
            if result {
                print("插入成功")
            } else {
                print("插入失败")
            }
        }
    
    }
    
    //  查询数据
    func select() {
        //  准备sql语句
        let sql = "SELECT ID, NAME, AGE FROM T_PERSON"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            let resultSet = db.executeQuery(sql, withArgumentsInArray: nil)
            
            while resultSet.next() {
                //  获取id
                let id = resultSet.intForColumn("ID")
                //  获取名字
                let name = resultSet.stringForColumn("NAME")
                //  获取年龄
                let age = resultSet.intForColumn("AGE")
                
                print("id: \(id), name: \(name), age: \(age)")
            }
            
        }
    
    }
    
    func select1() {
        //  准备sql语句
        let sql = "SELECT ID, NAME, AGE FROM T_PERSON"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            let resultSet = db.executeQuery(sql, withArgumentsInArray: nil)
            
            while resultSet.next() {
                //  获取id
                let id = resultSet.intForColumnIndex(0)
                //  获取名字
                let name = resultSet.stringForColumnIndex(1)
                //  获取年龄
                let age = resultSet.intForColumnIndex(2)
                
                print("id: \(id), name: \(name), age: \(age)")
            }
            
        }
        
    }
    
    
    //  记录转成字典
    func select2() {
        //  准备sql语句
        let sql = "SELECT ID, NAME, AGE FROM T_PERSON"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            //  获取结果集
            let resultSet = db.executeQuery(sql, withArgumentsInArray: nil)
            //  判断是否有下一条记录
            while resultSet.next() {
                var dic = [String: AnyObject]()
                for i in  0..<resultSet.columnCount() {
                    //  通过列索引取的列的名字
                    let colName = resultSet.columnNameForIndex(i)
                    //  通过列的索引取到列对应值
                    let colValue = resultSet.objectForColumnIndex(i)
                    //  添加键值对
                    dic[colName] = colValue
                    //                dic.updateValue(colValue, forKey: colName)
                    
                }
                
                print(dic)
            
            }
        
          
            
            
        }
    
    }
    //  通过SQL语句查询返回字典数组
    func queryResultSet(sql: String) -> [[String: AnyObject]] {
        var tempArray = [[String: AnyObject]]()
        //  准备sql语句
//        let sql = "SELECT ID, NAME, AGE FROM T_PERSON"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            //  获取结果集
            let resultSet = db.executeQuery(sql, withArgumentsInArray: nil)
            
            while resultSet.next() {
            
                var dic = [String: AnyObject]()
                for i in 0..<resultSet.columnCount() {
                    //  获取列名
                    let colName = resultSet.columnNameForIndex(i)
                    //  获取列值
                    let colValue = resultSet.objectForColumnIndex(i)
                    
                    //  添加键值对
                    dic.updateValue(colValue, forKey: colName)
                    
                    
                }
                
                tempArray.append(dic)
                
            }
            
            
        }
        
        return tempArray
    
    }
    
    //  修改数据
    func update() {
    
        //  准备sql语句
        let sql = "UPDATE T_PERSON SET NAME = ? WHERE ID = ?"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            
            let result = db.executeUpdate(sql, withArgumentsInArray: ["宋仲基", 1])
            if result {
                print("修改成功")
            } else {
                print("修改时失败")
            }
        }
    
    
    }
    
    //  删除
    func delete() {
        //  准备sql语句
        let sql = "DELETE FROM T_PERSON WHERE ID = 2"
        //  执行sql语句
        queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            if result {
                print("删除成功")
            } else {
                print("删除失败")
            }
        }
        
        
        
    }
    
    
    
    
    
    
    
}
